/*
 * Copyright (C) 2007 Sun Microsystems, Inc. All rights reserved. Use is subject
 * to license terms.
 */
package org.gwt.beansbinding.core.client;

/**
 * A factory class for creating instances of the concrete {@code Binding}
 * implementations provided by this package.
 * 
 * @author Shannon Hickey
 * @author Georgios J. Georgopoulos
 */
public class Bindings {

  private Bindings() {
  }

  /**
   * Creates an instance of {@code AutoBinding} that binds a source object to a
   * property of a target object. The {@code AutoBinding's} source property is
   * set to an instance of {@code ObjectProperty} so that the source object is
   * used directly, rather than some property of the source object.
   * 
   * @param strategy the update strategy for the binding
   * @param sourceObject the source object
   * @param targetObject the target object
   * @param targetProperty the target property
   * @return an {@code AutoBinding} that binds the source object to the target
   *         property of the target object
   * @throws IllegalArgumentException if the update strategy or target property
   *           is {@code null}
   */
  public static <SS, TS, TV> AutoBinding<SS, SS, TS, TV> createAutoBinding(
      AutoBinding.UpdateStrategy strategy, SS sourceObject, TS targetObject,
      Property<TS, TV> targetProperty) {
    return new AutoBinding<SS, SS, TS, TV>(strategy, sourceObject,
        ObjectProperty.<SS> create(), targetObject, targetProperty, null);
  }

  /**
   * Creates a named instance of {@code AutoBinding} that binds a source object
   * to a property of a target object. The {@code AutoBinding's} source property
   * is set to an instance of {@code ObjectProperty} so that the source object
   * is used directly, rather than some property of the source object.
   * 
   * @param strategy the update strategy for the binding
   * @param sourceObject the source object
   * @param targetObject the target object
   * @param targetProperty the target property
   * @param name a name for the binding
   * @return an {@code AutoBinding} that binds the source object to the target
   *         property of the target object
   * @throws IllegalArgumentException if the update strategy or target property
   *           is {@code null}
   */
  public static <SS, TS, TV> AutoBinding<SS, SS, TS, TV> createAutoBinding(
      AutoBinding.UpdateStrategy strategy, SS sourceObject, TS targetObject,
      Property<TS, TV> targetProperty, String name) {
    return new AutoBinding<SS, SS, TS, TV>(strategy, sourceObject,
        ObjectProperty.<SS> create(), targetObject, targetProperty, name);
  }

  /**
   * Creates an instance of {@code AutoBinding} that binds a property of a
   * source object to a property of a target object.
   * 
   * @param strategy the update strategy for the binding
   * @param sourceObject the source object
   * @param sourceProperty the source property
   * @param targetObject the target object
   * @param targetProperty the target property
   * @return an {@code AutoBinding} that binds the source object to the target
   *         property of the target object
   * @throws IllegalArgumentException if the update strategy, source property or
   *           target property is {@code null}
   */
  public static <SS, SV, TS, TV> AutoBinding<SS, SV, TS, TV> createAutoBinding(
      AutoBinding.UpdateStrategy strategy, SS sourceObject,
      Property<SS, SV> sourceProperty, TS targetObject,
      Property<TS, TV> targetProperty) {
    return new AutoBinding<SS, SV, TS, TV>(strategy, sourceObject,
        sourceProperty, targetObject, targetProperty, null);
  }

  /**
   * Creates a named instance of {@code AutoBinding} that binds a property of a
   * source object to a property of a target object.
   * 
   * @param strategy the update strategy for the binding
   * @param sourceObject the source object
   * @param sourceProperty the source property
   * @param targetObject the target object
   * @param targetProperty the target property
   * @param name a name for the binding
   * @return an {@code AutoBinding} that binds the source object to the target
   *         property of the target object
   * @throws IllegalArgumentException if the update strategy, source property or
   *           target property is {@code null}
   */
  public static <SS, SV, TS, TV> AutoBinding<SS, SV, TS, TV> createAutoBinding(
      AutoBinding.UpdateStrategy strategy, SS sourceObject,
      Property<SS, SV> sourceProperty, TS targetObject,
      Property<TS, TV> targetProperty, String name) {
    return new AutoBinding<SS, SV, TS, TV>(strategy, sourceObject,
        sourceProperty, targetObject, targetProperty, name);
  }

}
